package com.jweb.framework.ws.sdo;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.List;

import commonj.sdo11.Type;
/**
 * 修改人： Thomas
 * 修改内容：新增 
 * 类说明：SDO转换工具类
 */
public class SdoTypeUtils {
	
	static class InnerBigDecimal extends BigDecimal {
		
		private static final long serialVersionUID = -5559749337838821060L;
		
		InnerBigDecimal(String s){
			super(s);
		}
		
		public String toString(){
			return toPlainString();
		}
		
	}
	
	public SdoTypeUtils(){
		
	}
	
	private static SimpleDateFormat invokeA(){
		
		return new SimpleDateFormat("yyyy-MM-dd");
		
	}
	
	private static SimpleDateFormat invokeB(){
		
		return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
	}
	
	private static SimpleDateFormat invokeC(){
		
		return new SimpleDateFormat("HH:mm:ss");
	}
	
	private static java.util.Date invokeA(SimpleDateFormat simpleDateFormat , String s){
		try {
			
			return simpleDateFormat.parse(s);
		} catch (ParseException e) {
			throw new IllegalArgumentException((new StringBuilder("date parsing error, pattern: ")).append(simpleDateFormat.toPattern()).append(", value: ").append(s).toString());
		}
	}
	
	
	public static Object toData(Type type , Object obj){
		
		String s = type.getName() ;
		if(obj instanceof String){
			if("String".equals(s)){
				return obj ;
			}
			if("YearMonthDay".equals(s)){
				String s1 = (String) obj ;
				return new Date(invokeA(invokeA() , s1).getTime());
			}
			if("DateTime".equals(s)){
				String s2 = (String)obj;
				return new Timestamp(invokeA(invokeB() , s2).getTime());
			}
			if("Time".equals(s)){
				String s3 = (String)obj;
				return new Time(invokeA(invokeC() , s3).getTime());
			}
			List list = type.getBaseTypes();
			Iterator it = list.iterator();
			if(it.hasNext()){
				return toData((Type)it.next() , obj);
			}
		}
		
		return obj ;
	}
	
	
	public static Object toDso(Type type , Object obj){
		String s = type.getName(); // s="String"
		if(obj instanceof java.util.Date){
			if("YearMonthDay".equals(s)){
				java.util.Date date = (java.util.Date) obj ;
				return invokeA().format(date);
			}
			if("DateTime".equals(s)){
				java.util.Date date1 = (java.util.Date) obj ;
				return invokeB().format(date1);
			}
			if("Time".equals(s)){
				java.util.Date date2 = (java.util.Date) obj ;
				return invokeC().format(date2);
			}
			List list = type.getBaseTypes();
			Iterator it = list.iterator();
			if(it.hasNext()){
				return toDso((Type)it.next() , obj);
			}
		}
		
		Class clazz = type.getInstanceClass();//clazz=class java.lang.String
		if(clazz.isPrimitive()){// isPrimitive()判定指定的Class对象是否表示一个基本类型。
			clazz = invokeA(clazz);
		}
		if(Number.class.isAssignableFrom(clazz)){ //isAssignableFrom(Class<?> cls)判定此Class对象所表示的类或接口与指定的Class参数所表示的类或接口是否相同，或是否是其超类或超接口。
			if((obj instanceof String) && ((String)obj).trim().length() == 0){
				return null ;
			}
			if(BigDecimal.class.isAssignableFrom(clazz) && obj!=null){
				return new InnerBigDecimal(obj.toString());
			}
		}
		
		return SdoUtils.invoke(null, false).getDataHelper().convert(type, obj);
	}

	private static Class invokeA(Class clazz) {
		
		if(Integer.TYPE == clazz){
			return Integer.class ;
		}
		if(Long.TYPE == clazz){
			return Long.class ;
		}
		if(Double.TYPE == clazz){
			return Double.class ;
		}
		if(Byte.TYPE == clazz){
			return Byte.class ;
		}
		if(Float.TYPE == clazz){
			return Float.class ;
		}
		if(Short.TYPE == clazz){
			return Short.class ;
		}
		if(Boolean.TYPE == clazz){
			return Boolean.class ;
		}
		if(Character.TYPE == clazz){
			return Character.class ;
		}
		else {
			return null; 
		}
		
	}
	
}
